﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Web.Mvc;
using Newtonsoft.Json;
using ProjetoSolo.QueroGas.Aplicacao.Servicos;
using ProjetoSolo.QueroGas.Dominio.Entidades;
using Empresa = ProjetoSolo.QueroGas.Dominio.Entidades.Empresa;
using System.Linq;
using System.Web.Script.Serialization;

namespace Gas.Controllers
{
    public class EmpresaController : Controller
    {
        public ActionResult Listagem()
        {
            IList<Empresa> empresas = new List<Empresa>();
            return View("Listagem", null);
        }

        [HttpPost]
        public JsonResult Listagem(string jtSorting = null)
        {
            try
            {
                IList<Empresa> empresas = new List<Empresa>();

                if (System.Web.HttpRuntime.Cache["empresas"] != null)
                {
                    empresas = (List<Empresa>)System.Web.HttpRuntime.Cache["empresas"];
                }
                else
                {
                    System.Web.HttpRuntime.Cache["empresas"] = empresas;
                }

                if (!String.IsNullOrEmpty(jtSorting))
                {
                    bool orderByDesc = jtSorting.Contains("DESC");
                    
                    if (jtSorting.Contains("RazaoSocial"))
                        empresas = orderByDesc ? empresas.OrderByDescending(Empresa => Empresa.Nome).ToList() : empresas.OrderBy(Empresa => Empresa.Nome).ToList();
                    else if (jtSorting.Contains("Cep"))
                        empresas = orderByDesc ? empresas.OrderByDescending(Empresa => Empresa.Endereco.Cep).ToList() : empresas.OrderBy(Empresa => Empresa.Endereco.Cep).ToList();
                    else if (jtSorting.Contains("Uf"))
                        empresas = orderByDesc ? empresas.OrderByDescending(Empresa => Empresa.Endereco.Estado).ToList() : empresas.OrderBy(Empresa => Empresa.Endereco.Estado).ToList();
                    else if (jtSorting.Contains("Cidade"))
                        empresas = orderByDesc ? empresas.OrderByDescending(Empresa => Empresa.Endereco.Cidade).ToList() : empresas.OrderBy(Empresa => Empresa.Endereco.Cidade).ToList();
                    else if (jtSorting.Contains("Bairro"))
                        empresas = orderByDesc ? empresas.OrderByDescending(Empresa => Empresa.Endereco.Bairro).ToList() : empresas.OrderBy(Empresa => Empresa.Endereco.Bairro).ToList();
                }

                return Json(new { Result = "OK", Records = empresas });
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }

        public ActionResult Cadastro()
        {
            return View("Cadastro");
        }

        [HttpPost]
        public ActionResult Gravacao(Empresa empresa, string[] distribuidoras_, string produtos_)
        {
            IList<Produto> _produtos = JsonConvert.DeserializeObject<List<Produto>>(produtos_, new JsonSerializerSettings() {Culture = new CultureInfo("pt-BR")});

            foreach (var distribuidora in distribuidoras_)
                empresa.AdicionarDistribuidora(new Distribuidora(Int32.Parse(distribuidora)));

            foreach (var produto in _produtos)
                empresa.AdicionarProduto(produto);

            empresa.Endereco.Cep = empresa.Endereco.Cep.Replace("-", "");

            if (ModelState.IsValid)
            {
                //ServicoEmpresa.Cadastrar(empresa, Int32.Parse(Session["_id"].ToString()));
                ServicoEmpresa.Cadastrar(empresa, 41);
            }
            else
            {
                throw new Exception("not valid");
            }
            
            TempData["message"] = "Empresa Incluida com sucesso.";
            return View("Cadastro");
        }
        
        public ActionResult Alteracao(int id)
        {
            Empresa empresa = ServicoEmpresa.BuscarEmpresaPorCodigo(id);
            
            //{
            //    RazaoSocial = "SupergasBras",
            //    Cep = "111111111",
            //    Uf = "DF",
            //    Cidade = "Samambaia",
            //    Bairro = "Samambaia Norte",
            //    Logradouro = "QR 608 Conjunto 13",
            //    Complemento = "Casa 08"
            //};
            return View("Cadastro", empresa);            
        }

        public ActionResult Exclusao(int id)
        {
            // rotina de exclusão
            return View("Listagem");
        }

        [HttpPost]
        public JsonResult BuscarCep(string cep)
        {
            try
            {
                Endereco endereco = ServicoEndereco.BuscarPorCep(cep);
                return Json(endereco);
            }
            catch (Exception ex)
            {
                return ThrowJsonError(ex);
            }
        }

        private JsonResult ThrowJsonError(Exception e)
        {
            Response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest;
            return Json(new { Message = e.Message });
        }

        //private ProjetoSolo.QueroGas.Dominio.Entidades.Empresa MapearEmpresa(Empresa empresa, string[] fornecedores)
        //{
        //    ProjetoSolo.QueroGas.Dominio.Entidades.Empresa _empresa = new ProjetoSolo.QueroGas.Dominio.Entidades.Empresa(empresa.RazaoSocial)
        //    {
        //        Endereco = new Endereco(empresa.Cep, empresa.Uf, empresa.Cidade, empresa.Bairro, empresa.Logradouro, empresa.Complemento),
        //        Usuario = new Usuario(Session["_usuario"].ToString(), Session["_senha"].ToString(), Session["_email"].ToString())
        //    };

        //    _empresa.AdicionarTelefone("", empresa.Telefone, TipoTelefone.Fixo);

        //    foreach (string fornecedor in fornecedores)
        //        _empresa.AdicionarDistribuidora(fornecedor);

        //    return _empresa;
        //    //return null;            
        //}
    }
}
